GtkCssProvider: Transform custom colors to a @define-color rule.
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 8 Oct 2010 16:19:34 +0000 (18:19 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Sat, 4 Dec 2010 14:38:18 +0000 (15:38 +0100)
Given there are other rules such as @import (which will be supported),
keep a sane namespace here, so for (re)defining a color name, in the CSS
file it will look like:

@define-color color-name #fff;
@define-color other-color mix (@color-name, #f00, 0.4);

gtk/gtkcssprovider.c

index 8236022e5018b1a0119be9c91ec03093cd28c343..2dd42c06750a1928d961c65bdf0d79fcbf548be7 100644 (file)
@@ -1905,40 +1905,50 @@ parse_rule (GtkCssProvider *css_provider,
 
   css_provider_push_scope (css_provider, SCOPE_SELECTOR);
 
+  /* Handle directives */
   if (scanner->token == G_TOKEN_IDENTIFIER &&
       scanner->value.v_identifier[0] == '@')
     {
-      GtkSymbolicColor *color;
-      gchar *color_name, *color_str;
+      gchar *directive;
 
-      /* Rule is a color mapping */
-      color_name = g_strdup (&scanner->value.v_identifier[1]);
-      g_scanner_get_next_token (scanner);
+      directive = &scanner->value.v_identifier[1];
 
-      if (scanner->token != ':')
-        return ':';
+      if (strcmp (directive, "define-color") == 0)
+        {
+          GtkSymbolicColor *color;
+          gchar *color_name, *color_str;
 
-      css_provider_push_scope (css_provider, SCOPE_VALUE);
-      g_scanner_get_next_token (scanner);
+          /* Directive is a color mapping */
+          g_scanner_get_next_token (scanner);
 
-      if (scanner->token != G_TOKEN_IDENTIFIER)
-        return G_TOKEN_IDENTIFIER;
+          if (scanner->token != G_TOKEN_IDENTIFIER)
+            return G_TOKEN_IDENTIFIER;
 
-      color_str = g_strstrip (scanner->value.v_identifier);
-      color = symbolic_color_parse (color_str);
+          color_name = g_strdup (scanner->value.v_identifier);
+          css_provider_push_scope (css_provider, SCOPE_VALUE);
+          g_scanner_get_next_token (scanner);
 
-      if (!color)
-        return G_TOKEN_IDENTIFIER;
+          if (scanner->token != G_TOKEN_IDENTIFIER)
+            return G_TOKEN_IDENTIFIER;
 
-      g_hash_table_insert (priv->symbolic_colors, color_name, color);
+          color_str = g_strstrip (scanner->value.v_identifier);
+          color = symbolic_color_parse (color_str);
 
-      css_provider_pop_scope (css_provider);
-      g_scanner_get_next_token (scanner);
+          if (!color)
+            return G_TOKEN_IDENTIFIER;
 
-      if (scanner->token != ';')
-        return ';';
+          g_hash_table_insert (priv->symbolic_colors, color_name, color);
 
-      return G_TOKEN_NONE;
+          css_provider_pop_scope (css_provider);
+          g_scanner_get_next_token (scanner);
+
+          if (scanner->token != ';')
+            return ';';
+
+          return G_TOKEN_NONE;
+        }
+      else
+        return G_TOKEN_IDENTIFIER;
     }
 
   expected_token = parse_selector (css_provider, scanner, &selector);
@@ -2225,14 +2235,14 @@ gtk_css_provider_get_default (void)
   if (G_UNLIKELY (!provider))
     {
       const gchar *str =
-        "@fg_color: #000; \n"
-        "@bg_color: #dcdad5; \n"
-        "@text_color: #000; \n"
-        "@base_color: #fff; \n"
-        "@selected_bg_color: #4b6983; \n"
-        "@selected_fg_color: #fff; \n"
-        "@tooltip_bg_color: #eee1b3; \n"
-        "@tooltip_fg_color: #000; \n"
+        "@define-color fg_color #000; \n"
+        "@define-color bg_color #dcdad5; \n"
+        "@define-color text_color #000; \n"
+        "@define-color base_color #fff; \n"
+        "@define-color selected_bg_color #4b6983; \n"
+        "@define-color selected_fg_color #fff; \n"
+        "@define-color tooltip_bg_color #eee1b3; \n"
+        "@define-color tooltip_fg_color #000; \n"
         "\n"
         "*,\n"
         "GtkTreeView > GtkButton {\n"